#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *right;
    TreeNode *left;
};
void preOrderTraverase(TreeNode *t);
void insertTreeNode(TreeNode **t, int data);
vector<int> levelOrder(TreeNode *t);

//-------------核心代码---------------
vector<vector<int>> res;
vector<int> path; //存放每次走过的路径
void Findpath(TreeNode *root, int sum);

vector<vector<int>> pathSum(TreeNode *root, int sum)
{
    //先判空 后处理
    if (!root)
        return res;
    Findpath(root, sum);
    return res;
}

//递归遍历每条分支，过程中保存路径。用初始值sum -= val 来逐层减去val
//所以最后只需判断叶子节点减去后 sum是否为0即可。

void Findpath(TreeNode *root, int sum)
{
    if (!root) //递归结束条件
        return;

    path.push_back(root->val); //保存路径

    //判断条件***  叶子节点 && sum==0
    if ((root->left == NULL && root->right == NULL)) //叶子节点
    {
        if (sum == root->val)
            res.push_back(path);
        //        else
        //            path.pop_back(); // 想想为啥不能搁在这里
    }

    //递归进行
    Findpath(root->left, sum - root->val);
    Findpath(root->right, sum - root->val);

    path.pop_back();
}

int main()
{
    TreeNode *root = NULL;

    int n;
    cin >> n; //结点个数

    while (n--)
    {
        int data;
        cin >> data;
        insertTreeNode(&root, data);
    }

    //路径 输出
    vector<vector<int>> ans = pathSum(root, 22);

    auto iter = ans.begin();

    for (; iter != ans.end(); ++iter)
    {
        for (int i = 0; i < ans[i].size(); ++i)
        {
            cout << (*iter)[i] << endl;
        }
    }

    return 0;
}

//有序递归插入
void insertTreeNode(TreeNode **t, int data)
{
    if ((*t) == NULL)
    {
        (*t) = new TreeNode;
        (*t)->val = data;
        (*t)->left = (*t)->right = NULL;
    }
    else if (data > (*t)->val)
    {
        insertTreeNode(&((*t)->right), data);
    }
    else
        insertTreeNode(&((*t)->left), data);
}
